App Open
App Open ads are full-screen ads that appear when users launch your app, providing an excellent opportunity to monetize app startup moments. Unlike interstitial ads, App Open ads are specifically designed for app launch scenarios and help create a smooth user experience during cold starts and app foregrounding events.
Key Features
- Launch Optimization: Designed specifically for app startup scenarios
- User-Friendly: Integrates seamlessly with splash screens and loading experiences
- Revenue Maximization: Monetizes high-engagement moments when users actively open your app
- Retention-Focused: Built with user retention best practices in mind
Best Practices
- Always use a splash/loading screen before showing the App Open ad
- Inform users about the upcoming ad with a message like "Watch an ad from our sponsor while the app loads"
- Ensure proper sequence: Splash screen → App Open ad → App content
- Initialize the SDK before loading App Open ads
To maintain good user experience and retention:
- Implement external frequency capping outside of the SDK
- Consider cooldown periods between App Open ads
- Wait for new users to engage with your app before showing their first App Open ad
- Show ads strategically (e.g., every 2nd or 3rd app launch)
Start loading an ad
Load App Open ads during SDK initialization, ideally in your Application class or main activity startup.
- Kotlin
- Java
XMediatorAds.startWith(
activity = activity,
appKey = APP_KEY,
initCallback = {
XMediatorAds.AppOpen.load(APP_OPEN_PLACEMENT_ID)
}
)
XMediatorAds.startWith(activity, APP_KEY, initResult -> {
Log.d("InitResult", initResult.toString());
XMediatorAds.getAppOpen().load(APP_OPEN_PLACEMENT_ID);
return null;
});
Showing an ad
Show App Open ads when your app comes to the foreground. Check if an ad is ready before attempting to show it.
- Kotlin
- Java
if (XMediatorAds.AppOpen.isReady()) {
XMediatorAds.AppOpen.show(activity, "app-open-ad-space")
}
if (XMediatorAds.getAppOpen().isReady()) {
XMediatorAds.getAppOpen().show(activity, "app-open-ad-space");
}
Showing an ad with placementId
For specific placement targeting, use the placement-specific methods:
- Kotlin
- Java
if (XMediatorAds.AppOpen.isReady(APP_OPEN_PLACEMENT_ID)) {
XMediatorAds.AppOpen.show(APP_OPEN_PLACEMENT_ID, activity, "app-open-ad-space")
}
if (XMediatorAds.getAppOpen().isReady(APP_OPEN_PLACEMENT_ID)) {
XMediatorAds.getAppOpen().show(APP_OPEN_PLACEMENT_ID, activity, "app-open-ad-space");
}
Built-in features
Auto loading
When App Open ads are dismissed or fail to show, the SDK automatically triggers a new load request to ensure the next app launch opportunity is ready.
Auto retry
Failed load attempts are automatically retried with exponential backoff, ensuring optimal fill rates for your app launch monetization.
Additional settings
Register ad callbacks
Monitor App Open ad lifecycle events to implement custom logic and user experience flows:
- Kotlin
- Java
private val appOpenListener = object : AppOpenAds.Listener {
override fun onLoaded(placementId: String, loadResult: LoadResult) {
Log.d("Presenter", "App Open loaded. Placement $placementId, result: $loadResult")
}
override fun onShowed(placementId: String) {
Log.d("Presenter", "App Open shown: $placementId.")
// Hide splash screen here
}
override fun onFailedToShow(placementId: String, showError: ShowError) {
// Continue to app content if ad fails to show
Log.d("Presenter", "App Open failed to show $placementId, ${showError.message}")
proceedToAppContent()
}
override fun onDismissed(placementId: String) {
// User dismissed the ad, proceed to app content
Log.d("Presenter", "App Open dismissed for placementId: $placementId")
proceedToAppContent()
}
override fun onImpression(placementId: String, impressionData: ImpressionData) {
Log.d("Presenter", "App Open impression for placementId: $placementId, data: $impressionData")
}
override fun onClicked(placementId: String) {
Log.d("Presenter", "App Open clicked for placementId: $placementId")
}
}
XMediatorAds.AppOpen.addListener(appOpenListener)
XMediatorAds.getAppOpen().addListener(new AppOpenAds.Listener() {
@Override
public void onLoaded(@NonNull String placementId, @NonNull LoadResult loadResult) {
Log.d("Presenter", "App Open onLoaded. Placement " + placementId + ", result: " + loadResult);
}
@Override
public void onShowed(@NonNull String placementId) {
Log.d("Presenter", "App Open onShowed. Placement " + placementId);
// Hide splash screen here
}
@Override
public void onFailedToShow(@NonNull String placementId, @NonNull ShowError showError) {
// Continue to app content if ad fails to show
Log.d("Presenter", "App Open onFailedToShow. Placement " + placementId + ", error: " + showError.getMessage());
proceedToAppContent();
}
@Override
public void onDismissed(@NonNull String placementId) {
// User dismissed the ad, proceed to app content
Log.d("Presenter", "App Open onDismissed. Placement " + placementId);
proceedToAppContent();
}
@Override
public void onImpression(@NonNull String placementId, @NonNull ImpressionData impressionData) {
Log.d("Presenter", "App Open onImpression. Placement " + placementId + " ecpm: " + impressionData.getEcpm());
}
@Override
public void onClicked(@NonNull String placementId) {
Log.d("Presenter", "App Open onClicked. Placement " + placementId);
}
});
App Lifecycle Integration
For optimal App Open ad implementation, integrate with Android's lifecycle events:
- Kotlin
- Java
class MyApplication : Application(), LifecycleObserver {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForegrounded() {
// App comes to foreground - show App Open ad if ready
if (XMediatorAds.AppOpen.isReady()) {
// Get current activity and show ad
getCurrentActivity()?.let { activity ->
XMediatorAds.AppOpen.show(activity, "app-open-ad-space")
}
}
}
}
public class MyApplication extends Application implements LifecycleObserver {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onAppForegrounded() {
// App comes to foreground - show App Open ad if ready
if (XMediatorAds.getAppOpen().isReady()) {
Activity currentActivity = getCurrentActivity();
if (currentActivity != null) {
XMediatorAds.getAppOpen().show(currentActivity, "app-open-ad-space");
}
}
}
}
Code example
Implementation example showing App Open ads with splash screen integration:
- Kotlin
- Java
AppOpenSample.kt
import android.app.Activity
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.View
import android.widget.ProgressBar
import android.widget.TextView
import com.etermax.R
import com.etermax.xmediator.core.api.entities.ImpressionData
import com.etermax.xmediator.core.api.entities.LoadResult
import com.etermax.xmediator.core.api.entities.ShowError
import com.x3mads.android.xmediator.core.api.AppOpenAds
import com.x3mads.android.xmediator.core.api.XMediatorAds
class AppOpenSample : Activity() {
private val appKey = "app_key"
private val appOpenPlacementId = "placement_id"
private var splashProgressBar: ProgressBar? = null
private var splashMessage: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
splashProgressBar = findViewById(R.id.splash_progress)
splashMessage = findViewById(R.id.splash_message)
// Show user-friendly message about upcoming ad
splashMessage?.text = "Watch an ad from our sponsor while the app loads..."
XMediatorAds.AppOpen.addListener(listener = appOpenListener)
// Initialize SDK and load App Open ad
XMediatorAds.startWith(
activity = this,
appKey = appKey,
initCallback = {
XMediatorAds.AppOpen.load(appOpenPlacementId)
}
)
// Show ad after a short delay to ensure splash screen is visible
Handler(Looper.getMainLooper()).postDelayed({
showAppOpenAdIfReady()
}, 2000)
}
private fun showAppOpenAdIfReady() {
if (XMediatorAds.AppOpen.isReady(appOpenPlacementId)) {
XMediatorAds.AppOpen.show(appOpenPlacementId, this, "app-open-ad-space")
} else {
// No ad ready, proceed to main app
proceedToMainApp()
}
}
private fun proceedToMainApp() {
// Hide splash elements and show main app content
splashProgressBar?.visibility = View.GONE
splashMessage?.text = "Welcome to the app!"
// Navigate to main activity or show main content
// startActivity(Intent(this, MainActivity::class.java))
// finish()
}
override fun onDestroy() {
super.onDestroy()
XMediatorAds.AppOpen.removeListener(listener = appOpenListener)
}
private val appOpenListener = object : AppOpenAds.Listener {
override fun onLoaded(placementId: String, loadResult: LoadResult) {
Log.d("AppOpenSample", "App Open loaded. Placement $placementId, result: $loadResult")
}
override fun onShowed(placementId: String) {
Log.d("AppOpenSample", "App Open shown: $placementId.")
// Hide splash screen when ad is shown
splashProgressBar?.visibility = View.GONE
}
override fun onFailedToShow(placementId: String, showError: ShowError) {
Log.d("AppOpenSample", "App Open failed to show $placementId, ${showError.message}")
proceedToMainApp()
}
override fun onDismissed(placementId: String) {
Log.d("AppOpenSample", "App Open dismissed for placementId: $placementId")
proceedToMainApp()
}
override fun onImpression(placementId: String, impressionData: ImpressionData) {
Log.d("AppOpenSample", "App Open impression for placementId: $placementId, data: $impressionData")
}
override fun onClicked(placementId: String) {
Log.d("AppOpenSample", "App Open clicked for placementId: $placementId")
}
}
}
AppOpenSample.java
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.etermax.R;
import com.etermax.xmediator.core.api.entities.ImpressionData;
import com.etermax.xmediator.core.api.entities.LoadResult;
import com.etermax.xmediator.core.api.entities.ShowError;
import com.x3mads.android.xmediator.core.api.AppOpenAds;
import com.x3mads.android.xmediator.core.api.XMediatorAds;
public class AppOpenSample extends Activity {
private String appKey = "app_key";
private String appOpenPlacementId = "placement_id";
private ProgressBar splashProgressBar;
private TextView splashMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
splashProgressBar = findViewById(R.id.splash_progress);
splashMessage = findViewById(R.id.splash_message);
// Show user-friendly message about upcoming ad
splashMessage.setText("Watch an ad from our sponsor while the app loads...");
XMediatorAds.AppOpen.addListener(appOpenListener);
// Initialize SDK and load App Open ad
XMediatorAds.startWith(this, appKey, initResult -> {
Log.d("InitResult", initResult.toString());
XMediatorAds.AppOpen.load(appOpenPlacementId);
return null;
});
// Show ad after a short delay to ensure splash screen is visible
new Handler(Looper.getMainLooper()).postDelayed(() -> {
showAppOpenAdIfReady();
}, 2000);
}
private void showAppOpenAdIfReady() {
if (XMediatorAds.AppOpen.isReady(appOpenPlacementId)) {
XMediatorAds.AppOpen.show(appOpenPlacementId, this, "app-open-ad-space");
} else {
// No ad ready, proceed to main app
proceedToMainApp();
}
}
private void proceedToMainApp() {
// Hide splash elements and show main app content
splashProgressBar.setVisibility(View.GONE);
splashMessage.setText("Welcome to the app!");
// Navigate to main activity or show main content
// startActivity(new Intent(this, MainActivity.class));
// finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
XMediatorAds.AppOpen.removeListener(appOpenListener);
}
private AppOpenAds.Listener appOpenListener = new AppOpenAds.Listener() {
@Override
public void onLoaded(@NonNull String placementId, @NonNull LoadResult loadResult) {
Log.d("AppOpenSample", "App Open loaded. Placement " + placementId + ", result: " + loadResult);
}
@Override
public void onShowed(@NonNull String placementId) {
Log.d("AppOpenSample", "App Open shown: " + placementId);
// Hide splash screen when ad is shown
splashProgressBar.setVisibility(View.GONE);
}
@Override
public void onFailedToShow(@NonNull String placementId, @NonNull ShowError showError) {
Log.d("AppOpenSample", "App Open failed to show " + placementId + ", " + showError.getMessage());
proceedToMainApp();
}
@Override
public void onDismissed(@NonNull String placementId) {
Log.d("AppOpenSample", "App Open dismissed for placementId: " + placementId);
proceedToMainApp();
}
@Override
public void onImpression(@NonNull String placementId, @NonNull ImpressionData impressionData) {
Log.d("AppOpenSample", "App Open impression for placementId: " + placementId + ", data: " + impressionData);
}
@Override
public void onClicked(@NonNull String placementId) {
Log.d("AppOpenSample", "App Open clicked for placementId: " + placementId);
}
};
}
Advanced Use Cases
Need more control over the ad loading and presentation lifecycle? Check out the Advanced App Open API for fine-grained control using individual AppOpen
instances.